import electron, {
  app,
  globalShortcut,
  protocol,
  BrowserWindow,
} from 'electron';
// 引入渲染进程的的入口
import { main, guide } from './browsers';
// 公共的常量
import commonConst from '../common/utils/commonConst';
// API的接口
import API from './common/api';
// 放在托盘当中
import createTray from './common/tray';
// 注册热键
import registerHotKey from './common/registerHotKey';
// 本地配置文件
import localConfig from './common/initLocalConfig';
// 检查版本
import checkVersion from './common/versionHandler';
import {
  getSearchFiles,
  putFileToRubick,
  macBeforeOpen,
} from './common/getSearchFiles';
import '../common/utils/localPlugin';
// 注册系统插件
import registerSystemPlugin from './common/registerSystemPlugin';

class App {
  /**窗口的创造者 */
  public windowCreator: { init: () => void; getWindow: () => BrowserWindow };
  /**系统的插件 */
  private systemPlugins: any;
  constructor() {
    // 注册自定义协议
    // protocol.registerSchemesAsPrivileged(): Electron 的 protocol 模块的一个方法，用于注册一个或多个自定义的 URL 方案，并为它们分配特权。
    // scheme: 'app': 这定义了一个名为 app 的新的 URL 方案。一旦注册，你的 Electron 应用就可以使用这个方案（比如 app://something）。
    // privileges: 这定义了给定方案的权限。在这里，两种权限被定义：
    // secure: 如果为 true，则此方案被视为安全来源，与 https: 方案相似。这可以让你加载、执行和显示内容，而不会受到某些 Web 安全策略的限制。
    // standard: 如果为 true，则此方案将遵循与标准协议（如 http: 和 https:）相同的跨来源策略。这意味着，从这种方案加载的内容可以安全地与其他标准内容交互，而不会受到跨来源策略的限制。
    protocol.registerSchemesAsPrivileged([
      { scheme: 'app', privileges: { secure: true, standard: true } },
    ]);
    // 定义了一个窗口的创建者
    this.windowCreator = main();
    // 确保只有一个实例
    const gotTheLock = app.requestSingleInstanceLock();
    if (!gotTheLock) {
      app.quit();
    } else {
      this.systemPlugins = registerSystemPlugin();
      this.beforeReady();
      this.onReady();
      this.onRunning();
      this.onQuit();
    }
  }

  /**
   * 准备工作之前
   */
  beforeReady() {
    if (commonConst.macOS()) {
      macBeforeOpen();
      if (commonConst.production() && !app.isInApplicationsFolder()) {
        app.moveToApplicationsFolder();
      } else {
        app.dock.hide();
      }
    } else {
      app.disableHardwareAcceleration();
    }
  }

  /**
   * 准备工作
   */
  onReady() {
    const readyFunction = async () => {
      // 检查版本
      checkVersion();
      // 初始化默认数据
      await localConfig.init();
      // 获取配置
      const config = await localConfig.getConfig();
      // 首次打开的时候去引导页面
      if (!config.perf.common.guide) {
        guide().init();
        config.perf.common.guide = true;
        localConfig.setConfig(config);
      }
      // 创建窗体
      this.createWindow();
      // 获取窗体
      const mainWindow = this.windowCreator.getWindow();
      // 打开调试工具
      // mainWindow.webContents.openDevTools();
      // 初始化api
      API.init(mainWindow);
      // 创建托盘
      createTray(mainWindow);
      // 注册热键
      registerHotKey(mainWindow);
      // 触发系统的hooks;
      this.systemPlugins.triggerReadyHooks(
        Object.assign(electron, {
          mainWindow: this.windowCreator.getWindow(),
          API,
        })
      );
    };
    if (!app.isReady()) {
      app.on('ready', readyFunction);
    } else {
      readyFunction();
    }
  }

  /**
   * 监听运行
   */
  onRunning() {
    app.on('second-instance', (event, commandLine, workingDirectory) => {
      const files = getSearchFiles(commandLine, workingDirectory);
      const win = this.windowCreator.getWindow();
      // 当运行第二个实例时,将会聚焦到myWindow这个窗口
      // 如果有文件列表作为参数，说明是命令行启动
      if (win) {
        if (win.isMinimized()) {
          win.restore();
        }
        win.focus();
        if (files.length > 0) {
          win.show();
          putFileToRubick(win.webContents, files);
        }
      }
    });
    app.on('activate', () => {
      if (!this.windowCreator.getWindow()) {
        this.createWindow();
      }
    });
  }

  /**
   * 监听关闭
   */
  onQuit() {
    app.on('window-all-closed', () => {
      if (process.platform !== 'darwin') {
        app.quit();
      }
    });

    app.on('will-quit', () => {
      // 注销所有的快捷键
      globalShortcut.unregisterAll();
    });
    // 如果是开发环境
    if (commonConst.dev()) {
      if (process.platform === 'win32') {
        process.on('message', (data) => {
          if (data === 'graceful-exit') {
            app.quit();
          }
        });
      } else {
        process.on('SIGTERM', () => {
          app.quit();
        });
      }
    }
  }

  /**
   * 创建窗体
   */
  createWindow() {
    this.windowCreator.init();
  }
}

export default new App();
